package org.example.pinda.util;

import org.example.pinda.exception.code.EnumText;
import org.example.pinda.exception.code.EnumValue;

import java.util.Objects;
import java.util.Optional;

/**
 * 枚举工具类
 *
 * @author ryan fawcett
 * @see EnumValue
 * @see EnumText
 */
public class EnumUtils {

    /**
     * 通过枚举值获取枚举对象
     *
     * @param eClass 枚举类型
     * @param value  枚举值
     * @param <E>    枚举类
     * @param <T>    枚举值数据类型
     * @return 枚举对象
     */
    public static <E extends Enum<E> & EnumText<T>, T> Optional<E> get(Class<E> eClass, T value) {
        if (value == null) {
            return Optional.empty();
        }

        for (E enumConstant : eClass.getEnumConstants()) {
            if (Objects.equals(enumConstant.getValue(), value)) {
                return Optional.of(enumConstant);
            }
        }

        return Optional.empty();
    }

    /**
     * 通过枚举值获取枚举描述信息, 默认返回空字符串
     *
     * @param eClass 枚举类型
     * @param value  枚举值
     * @param <E>    枚举类型
     * @param <T>    枚举值数据类型
     * @return 枚举描述信息
     */
    public static <E extends Enum<E> & EnumText<T>, T> String getText(Class<E> eClass, T value) {
        Optional<E> enumByValue = get(eClass, value);

        if (enumByValue.isPresent()) {
            return enumByValue.get().getText();
        }

        return "";
    }

}
